//package cn.yitun.chat.yitunservermanagecore.general.manage.handler;
//
//import cn.yitun.chat.yituncommondispatch.action.ActionDispatch;
//import cn.yitun.chat.yituncommondispatch.data.resolver.BeanBox;
//import cn.yitun.chat.yituncommondispatch.data.resolver.gson.DefineValuesResolver;
//import cn.yitun.chat.yituncommonlibutil.lib.util.YitunJsonUtil;
//import cn.yitun.chat.yituncommonmessage.AbstractMessage;
//import cn.yitun.chat.yituncommonmessage.Head;
//import cn.yitun.chat.yituncommonmessage.Info;
//import cn.yitun.chat.yituncommonmessage.Message;
//import cn.yitun.chat.yituncommonmessage.client.ClientHead;
//import cn.yitun.chat.yituncommonmessage.result.ResultBodyMessage;
//import cn.yitun.chat.yituncommonmessage.result.ResultMessage;
//import cn.yitun.chat.yituncommonmessage.server.ServerHead;
//import cn.yitun.chat.yitunservercommonmessage.data.Auth;
//import com.google.gson.Gson;
//import com.google.gson.JsonElement;
//import com.google.gson.JsonObject;
//import com.google.gson.JsonParser;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.context.ApplicationContext;
//import org.springframework.stereotype.Controller;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.lang.reflect.Parameter;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Set;
//
//
//@Controller
//@Slf4j
//public class WebHandler {
//	@Resource
//	private ApplicationContext applicationContext = null;
//	private final Gson gson = new Gson();
//	private final ActionDispatch cd = new ActionDispatch("cn.yitun.chat.yitunservermanagecore.*.manage.*.controller");
//
//	private DefineValuesResolver pvr = new DefineValuesResolver();
//	private BeanBox beanBox;
//
//	public WebHandler() {
//		init();
//	}
//
//	private void init() {
//		beanBox = new BeanBox() {
//
//			Map<Class<?>, Object> map = new HashMap<>();
//
//			@Override
//			public void register(Class<?> requiredType, Object object) {
//				map.put(requiredType, object);
//			}
//
//			@SuppressWarnings("unchecked")
//			@Override
//			public <T> T getBean(Class<T> requiredType) {
//				Object value = null;
//				Set<Class<?>> keySet = map.keySet();
//				for (Class<?> type : keySet) {
//					if (requiredType == type || type.isAssignableFrom(requiredType)) {
//						value = map.get(type);
//						break;
//					}
//				}
//				if (null == value) {
//					value = applicationContext.getBean(requiredType);
//				}
//				return (T) value;
//			}
//		};
//	}
//
//	public Object onMessage(String message, HttpServletRequest request, HttpServletResponse response) {
//		Message data = null;
//		if (YitunJsonUtil.mayBeJSON(message)) {
//
//			String json = request.getParameter("auth");
//			Auth auth = YitunJsonUtil.jsonToObject(json, Auth.class);
//
//			JsonObject jo = new JsonParser().parse(message).getAsJsonObject();
//
//			boolean hasHead = jo.has("head");
//			boolean hasBody = jo.has("body");
//
//			if (hasHead && hasBody) {
//				JsonElement headElement = jo.get("head");
//				JsonObject bodyObject = jo.get("body").getAsJsonObject();
//
//				ClientHead head = gson.fromJson(headElement, ClientHead.class);
//				ServerHead resultHead = gson.fromJson(headElement, ServerHead.class);
//
//				String classCode = head.getAction();
//				String methodCode = head.getMethod();
//				String path = classCode + "/" + methodCode;
//
//				Class<?> classType = cd.getClass(path);
//				Method method = cd.getMethod(path);
//
//
//				if (null != classType && null != method) {
//					Object filter = applicationContext.getBean(classType);
//					if ((null != filter)) {
//						Parameter[] parameters = method.getParameters();
//						beanBox.register(Auth.class, auth);
//						beanBox.register(Head.class, head);
//						beanBox.register(HttpServletRequest.class, request);
//						beanBox.register(HttpServletResponse.class, response);
//						Object[] datas = pvr.resolver(bodyObject, parameters, beanBox);
//
//						try {
//
//							Object result = method.invoke(filter, datas);
//
//							if (null == result) {
//								resultHead.setTime(System.currentTimeMillis());
//								ResultMessage m = new ResultMessage();
//								m.setHead(resultHead);
//								data = m;
//							} else if (result instanceof AbstractMessage) {
//								AbstractMessage<?> m = (AbstractMessage<?>) result;
//								if (null == m.getHead()) {
//									resultHead.setTime(System.currentTimeMillis());
//									m.setHead(resultHead);
//								}
//								data = m;
//							} else if (result instanceof Info) {
//								resultHead.setTime(System.currentTimeMillis());
//								ResultBodyMessage m = new ResultBodyMessage();
//								m.setHead(resultHead);
//								m.setInfo((Info) result);
//								data = m;
//							} else {
//								resultHead.setTime(System.currentTimeMillis());
//								ResultBodyMessage m = new ResultBodyMessage();
//								m.setHead(resultHead);
//								m.setBody(result);
//								data = m;
//							}
//						} catch (IllegalAccessException e) {
//							log.error("", e);
//						} catch (IllegalArgumentException e) {
//							log.error("", e);
//						} catch (InvocationTargetException e) {
//							log.error("", e);
//						}
//					}
//				}
//			} else {
//				ServerHead head = new ServerHead();
//				head.setAction("");
//				head.setMethod("");
//				head.setResultCode(Head.code_fail);
//				head.setResultMessage("参数错误！");
//				head.setTime(System.currentTimeMillis());
//
//				ResultMessage m = new ResultMessage();
//				m.setHead(head);
//				data = m;
//			}
//
//		} else {
//			ServerHead head = new ServerHead();
//			head.setAction("");
//			head.setMethod("");
//			head.setResultCode(Head.code_fail);
//			head.setResultMessage("参数错误！");
//			head.setTime(System.currentTimeMillis());
//
//			ResultMessage m = new ResultMessage();
//			m.setHead(head);
//			data = m;
//		}
//		return data;
//	}
//}
